﻿#include <QTimerEvent>
#include <QEventLoop>
#include "CCorrectCtrMange.h"
#include "Public.h"

CCorrectCtrMange::CCorrectCtrMange(CDevDataBeltRealign* pDevData)
{
	m_pDevDataBeltRealign = pDevData;
	m_pCtrOper = new CCorrectCtrOper(m_pDevDataBeltRealign);
	m_pMutex = new QMutex(QMutex::Recursive);
	m_bhread.store(false);
	m_bShouldStop = false;
	m_bFrist = true;
	m_nCount = 0;
}

CCorrectCtrMange::~CCorrectCtrMange()
{
	// 1. 先设置停止标志
	m_bShouldStop = true;

	// 2. 停止工作线程
	threadStop();

	// 3. 安全停止线程
	if (isRunning()) 
	{
		quit();
		if (!wait(5000))
		{ // 等待3秒超时
			terminate();
			wait(1000);
		}
	}

	// 4. 清理资源（此时线程已完全停止）
	if (m_pCtrOper)
	{
		delete m_pCtrOper;
		m_pCtrOper = nullptr;
	}

	if (m_pMutex != nullptr) 
	{
		delete m_pMutex;
		m_pMutex = nullptr;
	}
}

bool CCorrectCtrMange::CtrDevice(SCtrInfo& stCtrInfo)
{
	// 检查停止标志
	if (m_bShouldStop) 
	{
		return false;
	}
	if (stCtrInfo.m_bCtrSync == true)
	{
		// 检查指针有效性
		if (!m_pCtrOper) 
		{
			return false;
		}
		return m_pCtrOper->CtrDevice(stCtrInfo);
	}
	else
	{
		// 如果正在停止，不接受新任务
		if (m_bShouldStop || !m_bhread.load()) 
		{
			return false;
		}
		//如果线程没启动 开启线程
		if (!m_bhread)
			return false;
		if (m_pMutex->tryLock(3000))
		{
			// 检查指针有效性
			if (!m_pCtrOper) 
			{
				return false;
			}
			if (m_vecCtrQueue.size() > 5)
				m_vecCtrQueue.clear();
			//如果是重复命令不添加
			if (m_vecCtrQueue.size() >= 1)
			{
				SCtrInfo stCtrInfoLast = m_vecCtrQueue[m_vecCtrQueue.size() - 1];
				if (stCtrInfo.m_nCtrCmd != stCtrInfoLast.m_nCtrCmd)
				{
					m_vecCtrQueue.push_back(stCtrInfo);
				}
			}
			else
			{
				m_vecCtrQueue.push_back(stCtrInfo);
			}
			m_pMutex->unlock();
			return true;
		}
		else
		{
			return false;
		}
	}
	return false;
}

bool CCorrectCtrMange::CtrDeviceEx(SCtrInfo& stCtrInfo)
{
	return CtrDevice(stCtrInfo);
}

void CCorrectCtrMange::threadStart()
{
	QMutexLocker locker(m_pMutex);
	if (!m_bhread.load())
	{
		if (m_bFrist)
		{
			start();
			m_bFrist = false;
		}
		m_bhread.store(true);
	}
}

void CCorrectCtrMange::threadStop()
{
	QMutexLocker locker(m_pMutex);
	if (m_bhread.load())
	{
		m_bhread.store(false);
		// 清空命令队列
		m_vecCtrQueue.clear();
	}
}

void CCorrectCtrMange::run()
{
	while (!m_bShouldStop)
	{
		// 使用局部作用域管理锁，避免长时间持有锁
		{
			QMutexLocker locker(m_pMutex);

			// 检查停止标志和指针有效性
			if (!m_bhread.load() || m_bShouldStop || !m_pCtrOper)
			{
				sysSleep(10);
				continue;
			}

			// 定期读取设备数据
			if (m_nCount >= 5)
			{
				m_pCtrOper->GetDevData(); // 读取设备数据
				m_nCount = 0;
			}
			else
			{
				m_nCount++;
			}

			// 处理命令队列
			if (m_vecCtrQueue.size() > 0)
			{
				SCtrInfo stCtrInfo = m_vecCtrQueue[0];
				m_vecCtrQueue.remove(0);

				// 在长时间操作前释放锁
				locker.unlock();
				m_pCtrOper->CtrDevice(stCtrInfo);
				locker.relock();
			}
		}

		// 在锁外睡眠，避免阻塞其他线程
		if (!m_bShouldStop) 
		{
			sysSleep(200);
		}
	}
}

